package cn.itcast.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 模拟一个剧组
 * @author zhy
 *
 */
public class Client {

	public static void main(String[] args) {
		final Actor actor = new Actor();
		
		
		/* 使用Proxy产生代理对象，要求被代理对象必须实现最少一个接口。
		 * 基于接口的动态代理
		 * 
		 * 静态代理：
		 * 	装饰者模式
		 * 动态代理的目的：
		 * 	对方法进行增强。
		 * newProxyInstance
		 * 方法参数：
		 * 	ClassLoader：和被代理对象使用相同的类加载器
		 *  Class[]:和被代理对象具有相同的行为。就是实现相同的接口
		 *  InvocationHanlder：它是一个接口。(就是标准或者规范)。含义就是：如何代理。
		 *  			策略模式：
		 *  				数据已经有了
		 *  				目标明确
		 *  				如何达成目标：就是策略
		 */
		IActor proxyActor = (IActor) Proxy.newProxyInstance(actor.getClass().getClassLoader(), 
				actor.getClass().getInterfaces(), 
				new InvocationHandler() {
					/**
					 * 参数：
					 * 	Object proxy：代理对象的引用
					 * 	Method method：当前执行的方法
					 * 	Object[] args：执行方法所需的参数
					 * 返回值：
					 * 	当前执行方法的返回值。
					 * 明确：
					 * 	执行被代理对象的任何方法，都会经过该方法。
					 */
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						//先取出给了多少钱
						Float money = (Float)args[0];
						//判断执行的是哪个方法
						if("basicAct".equals(method.getName())){
							if(money > 2000){
								method.invoke(actor, money/1.5f);
							}
						}
						if("dangerAct".equals(method.getName())){
							if(money > 6000){
								method.invoke(actor, money/1.5f);
							}
						}
						return null;
					}
				});
		
		
		
		proxyActor.basicAct(4000f);
		proxyActor.dangerAct(12000f);
		
		
		
		
		
		/*actor.basicAct(200f);
		actor.dangerAct(400f)*/
	}

}
